package doing.normal_301_400;

import org.junit.Test;

import java.util.concurrent.ThreadLocalRandom;

import static com.study.util.SwapUtil.swap;

/**
 * 384. Shuffle an Array 打乱数组
 * <p>
 * 打乱一个没有重复元素的数组。
 * <p>
 * 2019-05-19 12:22
 **/
@SuppressWarnings("all")
public class ShuffleAnArray {

    class Solution {

        private int[] nums;
        private int len;

        public Solution(int[] nums) {
            this.nums = nums;
            len = nums.length;
        }

        public int[] reset() {
            return nums;
        }

        public int[] shuffle() {
            int[] newNum = nums.clone();
            for (int i = 0; i < len; i++) {
                int j = ThreadLocalRandom.current().nextInt(i, len);
                swap(newNum, i, j);
            }
            return newNum;
        }
    }

    @Test
    public void test() {
        // 以数字集合 1, 2 和 3 初始化数组。
        int[] nums = {1, 2, 3};
        Solution solution = new Solution(nums);

        // 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。
        solution.shuffle();

        // 重设数组到它的初始状态[1,2,3]。
        solution.reset();

        // 随机返回数组[1,2,3]打乱后的结果。
        solution.shuffle();
    }
}






































/*
private int[] nums;
private int len;
private ThreadLocalRandom ran = ThreadLocalRandom.current();

public Solution(int[] nums) {
    this.nums=nums;
    len=nums.length;
}

public int[] reset() {
    return nums;
}

public int[] shuffle() {
    int[] newNum=nums.clone();
    for (int i = 0; i <len ; i++) {
        int j=ran.nextInt(i,len);
        int temp=newNum[j];
        newNum[j]=newNum[i];
        newNum[i]=temp;
    }
    return newNum;
}
*/
